#ifndef __GPIO_H
#define	__GPIO_H


#include "stm32f10x.h"


//gpio批量控制定义
enum {         
GPIO_WDI            ,
GPIO_MDU_LED        ,     
// GPIO_HX711_SCK       ,
// GPIO_HX711_DT         ,
};


// #define MOTOR_CD   	  1   	//铲刀电机
// #define MOTOR_XM    		2   	//卸模板电机
// #define MOTOR_BAXIS    	3    //B轴电机
// #define MOTOR_E			4		//挤出电机控制	

// #define MOTOR_DIR_CW     0   //顺时针方向
// #define MOTOR_DIR_CCW    1   //逆时针方向

// #define MOTOR_CD_DIR_MAX  1	//铲刀运动方向到最大方向
// #define MOTOR_CD_DIR_MIN  0	//铲刀运动方向到最小方向

// #define MOTOR_XM_DIR_MAX  1	//卸模板运动方向到最大方向
// #define MOTOR_XM_DIR_MIN  0	//卸模板运动方向到最小方向



// #define MOTOR_E_DIR_INTPUT  0	//挤出机运到到打印头方向
// #define MOTOR_E_DIR_OUTPUT  1	//挤出机运到到耗材箱方向

// #define MOTOR_MODE_STOP         0   //停止运动
// #define MOTOR_MODE_PULSE        1   //脉冲数量控制
// #define MOTOR_MODE_EXTER        2   //外部限位控制
// #define MOTOR_MODE_EXTER_PULSE        3   //依靠脉冲数量同时检测限位


// #define EMOTOR_MCU					1		//使用内置信号进行驱动
// #define EMOTOR_EXTERNAL				2		//使用外置信号进行驱动

// #define EMOTOR_EXT1					2		//切换为1号耗材通路驱动
// #define EMOTOR_EXT2					1		//切换为2号耗材通路驱动

// #define MOTOR_STATE_ERR                 1 //运行错误
// #define MOTOR_STATE_EXTER_OK            2 //外部限位停止成功
// #define MOTOR_STATE_PULSE_OK            3 //脉冲控制成功
// #define MOTOR_STATE_EXTER_PULSE_OK      4 //脉冲控制时限位成功
// #define MOTOR_STATE_RUN                 5 //运行中

//位带操作,实现51类似的GPIO控制功能
//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 
//IO口地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C 
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C 
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C 
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008 
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808 
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08 
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 
 
//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出 
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入


///* 定义LED连接的GPIO端口, 用户只需要修改下面的代码即可改变控制的LED引脚 */
//#define LED1_GPIO_PORT    	GPIOD		              /* GPIO端口 */
//#define LED1_GPIO_CLK 	    RCC_APB2Periph_GPIOD		/* GPIO端口时钟 */
//#define LED1_GPIO_PIN		GPIO_Pin_0		        

//#define LED2_GPIO_PORT    	GPIOC			              /* GPIO端口 */
//#define LED2_GPIO_CLK 	    RCC_APB2Periph_GPIOC		/* GPIO端口时钟 */
//#define LED2_GPIO_PIN		    GPIO_Pin_14			        



///** the macro definition to trigger the led on or off 
//  * 1 - off
//  *0 - on
//  */
//#define ON  1
//#define OFF 0

///*
//	代码中的“\”是 C 语言中的续行符语法，表示续行符的下一行与续行符所在的代码是
//  同一行。代码中因为宏定义关键字“#define”只是对当前行有效，所以我们使用续行符来
//  连接起来。应用续行符的时候要注意，在“\”后面不能有任何字符(包括注释、空格)，只
//  能直接回车。
//*/
///* 使用标准的固件库控制IO*/
//#define LED1(a)	if (a)	\
//					GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);\
//					else		\
//					GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)

//#define LED2(a)	if (a)	\
//					GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);\
//					else		\
//					GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)




///* 直接操作寄存器的方法控制IO */
//#define	digitalHi(p,i)		 {p->BSRR=i;}	 //输出为高电平		
//#define digitalLo(p,i)		 {p->BRR=i;}	 //输出低电平
//#define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态


///* 定义控制IO的宏 */
//#define LED1_TOGGLE		 digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
//#define LED1_OFF		   digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
//#define LED1_ON			   digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)

//#define LED2_TOGGLE		 digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
//#define LED2_OFF		   digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
//#define LED2_ON			   digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)

void RGB_LED_Write0(void);
void RGB_LED_Write1(void);
void RGB_LED1_Write_24Bits(uint8_t green1,uint8_t red1,uint8_t blue1,uint16_t num1,uint8_t green2,uint8_t red2,uint8_t blue2,uint16_t num2);
void RGB_LED2_Write_24Bits(uint8_t green1,uint8_t red1,uint8_t blue1,uint16_t num1,uint8_t green2,uint8_t red2,uint8_t blue2,uint16_t num2);
// void EMotorMode(u8 mode);
// void EMotorSIgSet(u8 mode,u8 sig);
void GpioSet(uint8_t gpio,uint8_t state);
uint8_t GpioGet(uint8_t gpio);
void GPIO_Config(void);
void gpio_set_dir(uint8_t gpio,uint32_t GMODE);
void TIM3_Int_Init(u16 arr,u16 psc);
void TIM4_Int_Init(u16 arr,u16 psc);
// void mootorRunSet(uint8_t motor,uint8_t mode,uint8_t dir,uint32_t pulse) ;
#endif /* __LED_H */
